欧几里得算法
Get the knowledge flowing and circulating! :)
目录
整数 正整数
两个整数的最大公约数是能够同时整除它们的最大的正整数。
在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中(大约公元前300年),所以它是现行的算法中历史最悠久的,而在中国则可以追溯至东汉出现的《九章算术》。
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。(定义中包含了递归的思想)
例如:欲求252和105的最大公约数。
求解:
Step1.
从右边的等价式子可以看出:252和105的最大公约数
105和42的最大公约数。
两数中较小的数是105;
两数的余数是42;
Step2.
两数中较小的数是42;
两数的余数是21;
Step3.
两数中较小的数是21;因为余数为0了,所以较小的数和两数相除的余数的最大公约数:21
两数的余数是0。
由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如
递归版
xxxxxxxxxx
51function gcd(a, b)
2if b = 0
3return a
4else
5return gcd(b, a mod b)
非递归版
xxxxxxxxxx
61function gcd(a, b)
2while b ≠ 0
3t ← b
4b ← a mod b
5a ← t
6return a
递归版
xxxxxxxxxx
91int gcd(int a, int b)
2{
3int r = a % b;
4
5if(r == 0)
6return b;
7else
8return gcd(b, r);
9}
非递归版
xxxxxxxxxx
111int gcd_nr(int a, int b)
2{
3int r = 1;
4while(r != 0)
5{
6r = a % b;
7a = b;
8b = r;
9}
10return a;
11}